#include "enemigo.h"


SDatosAtaque CEnemigo::AtaqueEnemigo[TIPOS_ENEM] = 
{	/* modX modY  modXA modYA modXS modYS  ancho alto*/
	{  5, -0.025,0.2,  0.025,0.2,  0.025, 0.2,  0.1},
	{  20, -0.025,0.2,  0.025,0.2,  0.025, 0.15,  0.1}
};

/*------------------------------------------------------------------------------
	Constructor
------------------------------------------------------------------------------*/
CEnemigo::CEnemigo()
{
	m_pListaDisparos=NULL;
	m_pRecursos=	 NULL;
	m_pObjetivo=	 NULL;
	m_eTipo=		 ENEM_GARRA;

}

/*------------------------------------------------------------------------------
	Destructor
------------------------------------------------------------------------------*/
CEnemigo::~CEnemigo()
{}

/*------------------------------------------------------------------------------
	Free memory function
------------------------------------------------------------------------------*/
void CEnemigo::Liberar()
{
	m_pListaDisparos=NULL;
	m_pRecursos=	 NULL;	
	m_pObjetivo=	 NULL;
	CPersonaje::Liberar();
}

/*------------------------------------------------------------------------------
	Draws the character
------------------------------------------------------------------------------*/
void CEnemigo::Dibujar()
{
	Controlar();
	CPersonaje::Actualizar();
}

/*------------------------------------------------------------------------------
	Enemy IA
------------------------------------------------------------------------------*/
void CEnemigo::Controlar()
{
	if(!m_pObjetivo)
		return;
	
	switch(getEstado())
	{
		//--------------------------------------
		case ESTADO_PJ_NORMAL:	
					
			if(	fabs(m_pObjetivo->getX()-getX())>0.5 &&
				fabs(m_pObjetivo->getX()-getX())<1 &&  
			   	frand()<0.13 )
			{	
				setEstado(ESTADO_PJ_CORRER);
				if(m_pObjetivo->getX()<getX())
				{
					setVelocX(-VELOCIDAD_X);
					setRotZ(GRADOS_IZQUIERDA);	
				}
				else
				{	
					setVelocX(VELOCIDAD_X);				
					setRotZ(GRADOS_DERECHA);									
				}
			}
			
			if(fabs(m_pObjetivo->getX()-getX())<0.5 &&
			   fabs(m_pObjetivo->getY()-getY())<0.1 &&  
			   frand()<0.13)
			{
				if(m_pObjetivo->getX()<getX())
					setRotZ(GRADOS_IZQUIERDA);	
				else
					setRotZ(GRADOS_DERECHA);									
	
				setVelocX(0);
				setEstado(ESTADO_PJ_ATAQUE);
			}
			
			if(m_pObjetivo->getY()>getY()+0.1	&&			   
			   BajoPlataforma())
			{					
				setVelocY(VELOCIDAD_SALTOY);
				setEstado(ESTADO_PJ_SALTO);
			}	
			
		break;
		
		//--------------------------------------				
		case ESTADO_PJ_CORRER:	
			if(fabs(m_pObjetivo->getX()-getX())<0.2)
			{	
				setEstado(ESTADO_PJ_NORMAL);
				setVelocX(0);			
			}
			
			if((m_pObjetivo->getY()>getY()+0.1	&& (BajoPlataforma())) ||
			    CEntidad::getDistanciaPared()<0.4 ||
			    SiguientePasoVacio())
			{					
				setVelocY(VELOCIDAD_SALTOY);
				setEstado(ESTADO_PJ_SALTO);
				
				if(getRotZ()==GRADOS_IZQUIERDA)
					setVelocX(-VELOCIDAD_SALTOX);
				else
					setVelocX(VELOCIDAD_SALTOX);
			}
		break;
		
		//--------------------------------------
		case ESTADO_PJ_SALTO:	
		
				if(getRotZ()==GRADOS_IZQUIERDA)
					setVelocX(-VELOCIDAD_SALTOX);
				else
					setVelocX(VELOCIDAD_SALTOX);		
		break;
		
		//--------------------------------------
		case ESTADO_PJ_ATAQUE:
		
			if(!m_pListaDisparos) 
				break;
					
			if(getFrameActual()==FRAME_DISPARO)
			{							
				switch (m_eTipo)
				{
					
					case ENEM_GARRA:
							float mx;mx=AtaqueEnemigo[m_eTipo].m_fmodXNormal*getEscalaX()*((90-getRotZ())/90);
							float my;my=AtaqueEnemigo[m_eTipo].m_fmodYNormal*getEscalaY();
							
							//printf("%f/%f\n",mx,my);
							/*
							glPushMatrix();								
							glTranslatef(getX(),getY(),0);		    
								
							glBegin( GL_LINES );
					    	  	glVertex3f( mx-(AtaqueEnemigo[m_eTipo].m_fAncho/2), -(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );
					    	  	glVertex3f( mx+(AtaqueEnemigo[m_eTipo].m_fAncho/2), -(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );
					    	  	glVertex3f( mx-(AtaqueEnemigo[m_eTipo].m_fAncho/2), +(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );
					    	  	glVertex3f( mx+(AtaqueEnemigo[m_eTipo].m_fAncho/2), +(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );

					    	  	glVertex3f( mx-(AtaqueEnemigo[m_eTipo].m_fAncho/2), -(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );
					    	  	glVertex3f( mx-(AtaqueEnemigo[m_eTipo].m_fAncho/2), +(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );
					    	  	glVertex3f( mx+(AtaqueEnemigo[m_eTipo].m_fAncho/2), -(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );
					    	  	glVertex3f( mx+(AtaqueEnemigo[m_eTipo].m_fAncho/2), +(AtaqueEnemigo[m_eTipo].m_fAlto/2),  0.0f );    	  
						    glEnd( );
						    glPopMatrix();
						    */
						if(m_pObjetivo->Colisiona(  getX()+mx,
													getY()+my,
													AtaqueEnemigo[m_eTipo].m_fAncho,
													AtaqueEnemigo[m_eTipo].m_fAlto))
							{
								//m_pObjetivo->setEstado(ESTADO_PJ_MORIR);
								m_pObjetivo->setVivo(FALSE);
								//m_pObjetivo->setVelocY(VELOCIDAD_SALTOY);
								//printf("WOAH!\n");
							}
					break;
					
					default:
						CDisparo *d;
						d=new CDisparo();
						d->setModelo(m_pRecursos->getMd2Disparo(0));
						d->setX(getX());
						d->setY(getY());
						d->setZ(getZ()-0.2);
						d->setRotZ(getRotZ()-90);
						d->setEscalaX(ESCALA_DISP);
						d->setEscalaY(ESCALA_DISP);
						d->setEscalaZ(ESCALA_DISP);
						d->setPadre(this);
						d->setEscenario(getEscenario());
				
						if(getRotZ()==GRADOS_IZQUIERDA)
							d->setVelocX(-VELOCX_DISP);
					
						m_pListaDisparos->Insertar(d);
						d=NULL;	
					break;				
					
				}			
			}
				
		break;			
		//--------------------------------------
		default:			
		break;
	}
}

